#pragma once

#include <memory>
#include <vector>
#include <unordered_map>
#include <functional>

class TimerTask;
class EventLoop;
class Channel;

class TimerWheel
{
public:
    using TaskFunc = std::function<void()>;

    TimerWheel(EventLoop* loop);
    ~TimerWheel();

    //添加定时任务
    void timerAdd(std::string name,uint32_t timeout, const TaskFunc& cb);
    //刷新或延迟定时任务
    void timerRefresh(std::string name);
    //取消定时任务
    void timerCancel(std::string name);

    bool hasTimer(std::string name);

private:
    //删除对应任务
    void removeTimer(std::string name);
    
    static int creatTimerfd();

    int readTimerfd();

    //这个函数每秒钟被执行一次，相当于秒针向后走了一步
    void runTimerTask();

    void onTime();

    void timerAddInLoop(std::string name,uint32_t timeout, const TaskFunc& cb);

    void timerRefreshInLoop(std::string name);

    void timerCancelInLoop(std::string name);

private:
    EventLoop* loop_;
    //定时器描述符
    int timerfd_;

    int tick_;      //当前秒针，走到哪就释放哪，即执行定时任务
    int capacity_;  //最大延时时间

    //管理定时器任务的生命周期
    using weakTask=std::weak_ptr<TimerTask>;
    using ptrTask=std::shared_ptr<TimerTask>;

    std::vector<std::vector<ptrTask>> wheel_;    //轮子, 二维数组，可能过5秒后同时执行多个任务
    std::unordered_map<std::string, weakTask> timers_;  //TimerTask对象的名称 和 TimerTask的映射
    std::unique_ptr<Channel> timerChannel_;    //存储timerfd_的channel
};